package java8.future;

import java.lang.ref.WeakReference;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.CompletableFuture;

/**
 * @program JavaBase
 * @description:
 * @author: zhanglu
 * @create: 2020-03-02 13:47:00
 */
public class CompletableFuntureInAction04 {

    public static void main(String[] args) throws InterruptedException {
        /*
            supplyAsync：无参，有返回
            runAsync：无参，无返回


            thenApply：上一个方法的返回值，有返回
            thenRun：上一个方法的返回值，无返回
            thenAccept：上一个方法的返回值，无返回

            thenCompose：类似于thenApply，但是
                thenApply。返回的是非CompletableFuture类型
                thenCompose，用来连接两个CompletableFuture，返回值是新的CompletableFuture

            thenCombine：取两个任务的结果，函数型接口
            thenAcceptBoth：取两个任务的结果，消费型接口

            exceptionally：(上一个方法的异常)，有返回
            handle：(上一个方法的返回值，异常)，有返回
            whenComplete：(上一个方法的返回值，异常)，无返回





         */

//        CompletableFuture.supplyAsync(() -> 1)
//                .thenApply(i -> Integer.sum(i, 10))
//                .whenComplete((v, t) -> System.out.println(v));

//        CompletableFuture.supplyAsync(() -> {
////            int i = 1/0;
//            return 1;
//        }).whenComplete((v, t) -> {
//            System.out.println(v);
//        }).handle((v, t) -> {
//            return Integer.sum(v, 10);
//        }).whenComplete((v, t) -> {
//            System.out.println(v);
//        }).thenRun(System.out::println);
//
//        CompletableFuture.supplyAsync(() -> 1)
//                .thenApply(i -> Integer.sum(i, 10))
//                .thenAccept(i -> System.out.println(1));
////
//        CompletableFuture.supplyAsync(() -> 1)
//                .thenCompose(i -> CompletableFuture.supplyAsync(() -> 10 * i))
//                .thenAccept(System.out::println);
//
//        CompletableFuture.supplyAsync(() -> 1)
//                .thenCombine(CompletableFuture.supplyAsync(() -> 2.0d), (r1, r2) -> r1 + r2)
//                .thenAccept(System.out::println);
//
//        CompletableFuture.supplyAsync(() -> 1)
//                .thenAcceptBoth(CompletableFuture.supplyAsync(() -> 2.0d), (r1, r2) -> {
//                    System.out.println(r1);
//                    System.out.println(r2);
//                    System.out.println(r1 + r2);
//                });
//
//        while (true){}

        String nextTime = LocalDateTime.now().plusMinutes(-2).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        System.out.println(nextTime);

    }

}
